﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>智能感应 - 脚本示例 | AutoHotkey v2</title>
<meta name="description" content="The IntelliSense script shows a parameter list of a function you typed in an AutoHotkey script and optionally displays that function's page in the help." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
</head>
<body>

<h1>智能感应 <span class="headnote">作者: Jon</span></h1>

<p>此脚本会在您编辑 AutoHotkey 脚本时进行监视. 当它看到您输入命令后跟着逗号或空格后, 会显示此命令的参数列表以给您提示. 此外, 您可以按下 <kbd>Ctrl</kbd>+<kbd>F1</kbd>(或您选择的其他热键) 来显示帮助文件中此命令的页面. 要取消参数列表, 请按 <kbd>Escape</kbd> 或 <kbd>Enter</kbd>.
</p>
<p><a href="IntelliSense.ahk">下载此脚本</a> &nbsp;| &nbsp;<a href="index.htm">其他示例脚本</a> &nbsp;| &nbsp;<a href="../AutoHotkey.htm">主页</a></p>

<pre class="NoIndent"><em>; CONFIGURATION SECTION: Customize the script with the following variables.</em>

<em>; The hotkey below is pressed to display the current command's page in the
; help file:</em>
I_HelpHotkey := "^F1"

<em>; The string below must exist somewhere in the active window's title for
; IntelliSense to be in effect while you're typing.  Make it blank to have
; IntelliSense operate in all windows.  Make it Pad to have it operate in
; editors such as Metapad, Notepad, and Textpad.  Make it .ahk to have it
; operate only when a .ahk file is open in Notepad, Metapad, etc.</em>
I_Editor := "pad"

<em>; If you wish to have a different icon for this script to distinguish it from
; other scripts in the tray, provide the filename below (leave blank to have
; no icon). For example: E:\stuff\Pics\icons\GeoIcons\Information.ico</em>
I_Icon := ""

<em>; END OF CONFIGURATION SECTION (do not make changes below this point unless
; you want to change the basic functionality of the script).</em>

SetKeyDelay 0
#SingleInstance

if I_HelpHotkey != ""
    Hotkey I_HelpHotkey, "I_HelpHotkey"

<em>; Change tray icon (if one was specified in the configuration section above):</em>
if I_Icon != ""
    if FileExist(I_Icon)
        TraySetIcon I_Icon

<em>; Determine AutoHotkey's location:</em>
ahk_dir := RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoHotkey", "InstallDir")
if ErrorLevel  <em>; Not found, so look for it in some other common locations.</em>
{
    if A_AhkPath
        SplitPath A_AhkPath,, ahk_dir
    else if FileExist("..\..\AutoHotkey.chm")
        ahk_dir := "..\.."
    else if FileExist(A_ProgramFiles "\AutoHotkey\AutoHotkey.chm")
        ahk_dir := A_ProgramFiles "\AutoHotkey"
    else
    {
        MsgBox "Could not find the AutoHotkey folder."
        ExitApp
    }
}

ahk_help_file := ahk_dir "\AutoHotkey.chm"

<em>; Read command syntaxes; can be found in AHK Basic, but it's outdated:</em>
Loop Read, ahk_dir "\Extras\Editors\Syntax\Commands.txt"
{
    I_FullCmd := A_LoopReadLine

    <em>; Directives have a first space instead of a first comma.</em>
    <em>; So use whichever comes first as the end of the command name:</em>
    I_cPos := InStr(I_FullCmd, ",")
    I_sPos := InStr(I_FullCmd, "`s")
    if (!I_cPos or (I_cPos &gt; I_sPos and I_sPos))
        I_EndPos := I_sPos
    else
        I_EndPos := I_cPos

    if I_EndPos
        I_CurrCmd := SubStr(I_FullCmd, 1, I_EndPos - 1)
    else  <em>; This is a directive/command with no parameters.</em>
        I_CurrCmd := A_LoopReadLine
    
    I_CurrCmd := StrReplace(I_CurrCmd, "[")
    I_CurrCmd := StrReplace(I_CurrCmd, "`s")
    I_FullCmd := StrReplace(I_FullCmd, "``n", "`n")
    I_FullCmd := StrReplace(I_FullCmd, "``t", "`t")
    
    <em>; Make arrays of command names and full cmd syntaxes:</em>
    I_Cmd%A_Index% := I_CurrCmd
    I_FullCmd%A_Index% := I_FullCmd
}

<em>; Use the Input command to watch for commands that the user types:</em>
Loop
{
    <em>; Editor window check:</em>
    if !InStr(WinGetTitle("A"), I_Editor)
    {
        ToolTip
        Sleep 500
        Continue
    }
    
    <em>; Get all keys till endkey:</em>
    I_Word := Input("V", "{Enter}{Escape}{Space},")
    I_EndKey := ErrorLevel
    
    <em>; ToolTip is hidden in these cases:</em>
    if I_EndKey = "EndKey:Enter" or I_EndKey = "EndKey:Escape"
    {
        ToolTip
        Continue
    }

    <em>; Editor window check again!</em>
    if !InStr(WinGetTitle("A"), I_Editor)
    {
        ToolTip
        Continue
    }

    <em>; Compensate for any indentation that is present:</em>
    I_Word := StrReplace(I_Word, "`s")
    I_Word := StrReplace(I_Word, "`t")
    if I_Word = ""
        Continue
    
    <em>; Check for commented line:</em>
    I_Check := SubStr(I_Word, 1, 1)
    if (I_Check = ";" or I_Word = "If")  <em>; "If" seems a little too annoying to show tooltip for.</em>
        Continue

    <em>; Match word with command:</em>
    I_Index := ""
    Loop
    {
        <em>; It helps performance to resolve dynamic variables only once.
        ; In addition, the value put into I_ThisCmd is also used by the
        ; I_HelpHotkey subroutine:</em>
        I_ThisCmd := I_Cmd%A_Index%
        if I_ThisCmd = ""
            break
        if (I_Word = I_ThisCmd)
        {
            I_Index := A_Index
            I_HelpOn := I_ThisCmd
            break
        }
    }
    
    <em>; If no match then resume watching user input:</em>
    if I_Index = ""
        Continue
    
    <em>; Show matched command to guide the user:</em>
    I_ThisFullCmd := I_FullCmd%I_Index%
    CaretGetPos CaretX, CaretY
    ToolTip I_ThisFullCmd, CaretX, CaretY + 20
}



I_HelpHotkey:
if !InStr(WinGetTitle("A"), I_Editor)
    return

ToolTip  <em>; Turn off syntax helper since there is no need for it now.</em>

SetTitleMatchMode 1  <em>; In case it's 3. This setting is in effect only for this thread.</em>
if !WinExist("AutoHotkey Help")
{
    if !FileExist(ahk_help_file)
    {
        MsgBox "Could not find the help file: " ahk_help_file
        return
    }
    Run ahk_help_file
    WinWait "AutoHotkey Help"
}

if I_ThisCmd = ""  <em>; Instead, use what was most recently typed.</em>
    I_ThisCmd := I_Word

<em>; The above has set the "last found" window which we use below:</em>
WinActivate
WinWaitActive
I_ThisCmd := StrReplace(I_ThisCmd, "#", "{#}")  <em>; Replace leading #, if any.</em>
Send "!n{home}+{end}" I_HelpOn "{enter}"
return
</pre>
</body>
</html>